﻿package com.snzflash.components.core 
{
	import flash.display.DisplayObject;
	import flash.geom.Rectangle;
	import org.casalib.display.CasaSprite;
	
	/**
	 * Контейнер для items компонентов - Grid, List и т.д.
	 * Изменился механизм для подсчета высоты, ширины, вместо встроенного
	 * @author firsoff maxim, tel: +79222345364, skype: maxim.firsoff
	 */
	public class UIContainer extends CasaSprite
	{
		// геометрия
		protected var __width:Number = 0;
		protected var __height:Number = 0;
		private var _rawWidth:Number = 0;
		private var _rawHeight:Number = 0;
		
		public function UIContainer() 
		{
			super();
		};
		
		override public function addChild(child:DisplayObject):DisplayObject 
		{
			var result:DisplayObject = super.addChild(child);
			// пересчитываем геометрию
			updateSize();
			_rawWidth = super.width;
			_rawHeight = super.height;
			return result;
		};
		
		/**
		 * Пересчет размеров
		 */
		protected function updateSize():void 
		{
			var w:Number = __width;
			var h:Number = __height;
			var l:Number = 0;
			var r:Number = 0;
			var t:Number = 0;
			var b:Number = 0;
			var d_x:Number
			var d_y:Number
			var d_o:DisplayObject;
			
			for (var i:int = 0; i < numChildren; i++) 
			{
				d_o = getChildAt(i);
				d_x = d_o.x;
				d_y = d_o.y;
				
				// левая, правая границы
				l = d_x < l ? d_x : l;
				r = (d_x + d_o.width) > r ? (d_x + d_o.width) : r;
				
				// верхняя, нижняя границы
				t = d_y < t ? d_y : t;
				b = (d_y + d_o.height) > b ? (d_y + d_o.height) : b;
				
				////trace(d_y, d_o.height);
			};
			
			__width = r - l;
			//__width = super.width
			
			__height = b - t;
			//__height = super.height
		}
		
		override public function get width():Number 
		{
			updateSize();
			return __width; 
		};
		
		override public function set width(value:Number):void 
		{
			__width = value;
		};
		
		override public function get height():Number 
		{
			updateSize();
			////trace(__height, numChildren, this);
			return __height; 
		};
		
		override public function set height(value:Number):void 
		{
			__height = value;
		};
		
		public function get rawWidth():Number { return super.width; };
		
		public function set rawWidth(value:Number):void 
		{
			_rawWidth = value;
			super.width = value;
		};
		
		public function get rawHeight():Number { return super.height; };
		
		public function set rawHeight(value:Number):void 
		{
			_rawHeight = value;
			super.height = value;
		};
		
		override public function getBounds(targetCoordinateSpace:DisplayObject):Rectangle 
		{
			var result:Rectangle = super.getBounds(targetCoordinateSpace);
			updateSize();
			result.width = __width;
			result.height = __height;
			return result;
		};
		
	}

}